package com.redepronik.negosys.rrhh.entity;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Past;
import javax.validation.constraints.Pattern;

import org.hibernate.annotations.IndexColumn;
import org.hibernate.validator.constraints.Length;

import com.redepronik.negosys.seguridad.entity.Usuario;

/**
 * The persistent class for the persona database table.
 * 
 */
@Entity
@Table(schema = "rrhh", name = "persona")
@NamedQuery(name = "Persona.findAll", query = "SELECT p FROM Persona p")
public class Persona implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	@SequenceGenerator(allocationSize = 1, name = "PERSONA_PERSONAID_GENERATOR", sequenceName = "RRHH.PERSONA_PERSONAID_SEQ")
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "PERSONA_PERSONAID_GENERATOR")
	@Column(unique = true, nullable = false)
	private Integer personaid;

	@Column(nullable = false)
	private Boolean activo;

	@Pattern(regexp = "[A-Za-z ñÑ]{3,50}", message = "EL CAMPO APELLIDO ACEPTA DE 3 A 50 LETRAS")
	@Column(nullable = false, length = 50)
	private String apellido;

	@Pattern(regexp = "[0-9]{10,13}+", message = "EL CAMPO CÉDULA ACEPTA DE 10 A 13 DÍGITOS NUMÉRICOS")
	// @Length(min = 10, max = 13, message =
	// "EL CAMPO CÉDULA ACEPTA DE 10 A 13 NÚMEROS")
	@Column(nullable = false, length = 13)
	private String cedula;

	@Length(min = 5, max = 500, message = "EL CAMPO DIRECCION ACEPTA DE 5 A 500 LETRAS")
	@Column(length = 500)
	private String direccion;

	@NotNull(message = "INGRESE FECHA DE NACIMIENTO")
	@Past(message = "INGRESE UNA FECHA DE NACIMIENTO ANTERIOR A LA FECHA ACTUAL")
	@Temporal(TemporalType.DATE)
	@Column(nullable = false)
	private Date fechanacimiento;

	@Temporal(TemporalType.DATE)
	@Column(nullable = false)
	private Date fecharegistro;

	// @Length(min = 3, max = 50, message =
	// "EL CAMPO NOMBRE ACEPTA DE 3 A 50 LETRAS")
	@Pattern(regexp = "[A-Za-z ñÑ]{3,50}", message = "EL CAMPO NOMBRE ACEPTA DE 3 A 50 LETRAS")
	// @NotBlank(message = "INGRESE UN NOMBRE")
	@Column(nullable = false, length = 50)
	private String nombre;

	@Column(length = 2147483647)
	private String referencia;

	// bi-directional many-to-one association to Cliente
	@OneToOne(cascade = CascadeType.ALL, mappedBy = "persona")
	private Cliente cliente;

	// bi-directional many-to-one association to Empleado
	@OneToOne(cascade = CascadeType.ALL, mappedBy = "persona")
	private Empleado empleado;

	// bi-directional many-to-one association to Ciudad
	@ManyToOne
	@JoinColumn(name = "ciudadid", nullable = false)
	private Ciudad ciudad;

	// bi-directional many-to-one association to Proveedor
	@OneToOne(cascade = CascadeType.ALL, mappedBy = "persona")
	private Proveedor proveedor;

	// bi-directional many-to-one association to Proveedor
	@OneToOne(cascade = CascadeType.ALL, mappedBy = "persona")
	private Usuario usuario;

	// bi-directional many-to-one association to Emailpersona
	@OneToMany(orphanRemoval = true, cascade = CascadeType.ALL, mappedBy = "persona")
	@IndexColumn(name = "orden", base = 1)
	private List<Emailpersona> emailpersonas;

	// bi-directional many-to-one association to Telefonopersona
	@OneToMany(orphanRemoval = true, cascade = CascadeType.ALL, mappedBy = "persona")
	@IndexColumn(name = "orden", base = 1)
	private List<Telefonopersona> telefonopersonas;

	public Persona() {
	}

	public Emailpersona addEmailpersona(Emailpersona emailpersona) {
		getEmailpersonas().add(emailpersona);
		emailpersona.setPersona(this);

		return emailpersona;
	}

	public Telefonopersona addTelefonopersona(Telefonopersona telefonopersona) {
		getTelefonopersonas().add(telefonopersona);
		telefonopersona.setPersona(this);

		return telefonopersona;
	}

	public Boolean getActivo() {
		return this.activo;
	}

	public String getApellido() {
		return this.apellido;
	}

	public String getCedula() {
		return this.cedula;
	}

	public Ciudad getCiudad() {
		return this.ciudad;
	}

	public Cliente getCliente() {
		return this.cliente;
	}

	public String getDireccion() {
		return this.direccion;
	}

	public List<Emailpersona> getEmailpersonas() {
		return this.emailpersonas;
	}

	public Empleado getEmpleado() {
		return this.empleado;
	}

	public Date getFechanacimiento() {
		return this.fechanacimiento;
	}

	public Date getFecharegistro() {
		return this.fecharegistro;
	}

	public String getNombre() {
		return this.nombre;
	}

	public Integer getPersonaid() {
		return this.personaid;
	}

	public Proveedor getProveedor() {
		return this.proveedor;
	}

	public String getReferencia() {
		return this.referencia;
	}

	public List<Telefonopersona> getTelefonopersonas() {
		return this.telefonopersonas;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public Emailpersona removeEmailpersona(Emailpersona emailpersona) {
		getEmailpersonas().remove(emailpersona);
		emailpersona.setPersona(null);

		return emailpersona;
	}

	public Telefonopersona removeTelefonopersona(Telefonopersona telefonopersona) {
		getTelefonopersonas().remove(telefonopersona);
		telefonopersona.setPersona(null);

		return telefonopersona;
	}

	public void setActivo(Boolean activo) {
		this.activo = activo;
	}

	public void setApellido(String apellido) {
		this.apellido = apellido;
	}

	public void setCedula(String cedula) {
		this.cedula = cedula;
	}

	public void setCiudad(Ciudad ciudad) {
		this.ciudad = ciudad;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public void setDireccion(String direccion) {
		this.direccion = direccion;
	}

	public void setEmailpersonas(List<Emailpersona> emailpersonas) {
		this.emailpersonas = emailpersonas;
	}

	public void setEmpleado(Empleado empleado) {
		this.empleado = empleado;
	}

	public void setFechanacimiento(Date fechanacimiento) {
		this.fechanacimiento = fechanacimiento;
	}

	public void setFecharegistro(Date fecharegistro) {
		this.fecharegistro = fecharegistro;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public void setPersonaid(Integer personaid) {
		this.personaid = personaid;
	}

	public void setProveedor(Proveedor proveedor) {
		this.proveedor = proveedor;
	}

	public void setReferencia(String referencia) {
		this.referencia = referencia;
	}

	public void setTelefonopersonas(List<Telefonopersona> telefonopersonas) {
		this.telefonopersonas = telefonopersonas;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

}